package com.ftg.learn.framework.springframework.core;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 核心
 *
 * @author lijiaxin
 * @version 1.0
 * @date 2023/9/11 15:04
 */

public class MyCore {
    //p10 --> spring 在你的项目当中的作用是什么 ?
//   完成类的生命周期，以及类与类之间的关系管理

//    ioc 是什么 ?
//        IOC 控制反转 : 定义 将类的创建、销毁等权限移交给第三方


    //容器 池
    private Map<Class, Object> knowBeans = new ConcurrentHashMap<>(2);

    /**
     * 存
     *
     * @param e   类的关联对象
     * @param <E> 类的原始类型
     * @return true
     */
    public <E> boolean registerBean(Class<E> e) {
        try {
            Object obj = e.newInstance();
            knowBeans.put(e, obj);
        } catch (InstantiationException | IllegalAccessException ex) {
            System.err.println("我的类实例化出错了");
            return false;
        }
        return true;
    }

    /**
     * 豆子工厂
     *
     * @param e 类的关联对象
     * @return true
     */
    public boolean beanFactory(Class<?>... e) {
        for (Class<?> eClass : e) {
            this.registerBean(eClass);
        }
        return true;
    }

    public void xmlBuilder() {
        Document document = null;
        SAXReader saxReader = new SAXReader();
        try {
            document = saxReader.read(new File("D:idea/src/main/java/com/ftg/learn/framework/springframework/core/ljx.xml"));
            // 读取XML文件,得到document对象
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }

        //beans
        Element root = document.getRootElement();

        List<Element> elements = root.elements();

        for (int i = 0; i < elements.size(); i++) {
//             bean
            Element subElement = elements.get(i);

//            System.out.println(subElement.attribute("id").getValue());
            String path = subElement.attribute("class").getValue();
            try {
                Class c = Class.forName(path);
                this.registerBean(c);
            } catch (ClassNotFoundException e) {
                throw new RuntimeException(e);
            }
        }

    }


    /**
     * 取
     *
     * @param e   类的关联对象
     * @param <E> 类的原始类型
     * @return true
     */
    public <E> E getBean(Class<E> e) {
        return (E) knowBeans.get(e);
    }


    /**
     * core ioc :
     * 1 : 存 (实例化) class
     * 2 ： 取 (实例)
     *
     * @param args
     */
    public static void main(String[] args) {
        MyCore myCore = new MyCore();
        //xml解析技术
        myCore.xmlBuilder();

        fox bean = myCore.getBean(fox.class);
        bean.setName("张三");
        System.out.println(bean.getName());

        //相当于 不用你来找我了，我会找到你 donot call me we will call us; 好菜坞模式
//        myCore.beanFactory(Fox.class, Panda.class);
//
////        IOC 控制反转 : 定义 将类的创建、销毁等权限移交给第三方  作用 完成类的生命周期，以及类与类之间的关系管理
//
//        //自动完成了
//        Fox bean = myCore.getBean(Fox.class);
//        Fox bean1 = myCore.getBean(Fox.class);
//        Fox bean2 = myCore.getBean(Fox.class);
//        Fox bean3 = myCore.getBean(Fox.class);

        //1 : xml解析技术 :
        //2 : spring 内容读了 .
        //3 ：把代码写了 ---> xml 里面有大量的配置信息.全部都是通过节点完成的
        //4 ：超市 (...)


    }
}
